package question.interview.precision;

import org.junit.Test;

import java.math.BigDecimal;

/**
 * @Description 小数精度相关面试题
 * @Author away
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/6/18
 */
public class FloatPrimitiveTest {


    /**
     *
     * @Description 采用IEEE的浮点数规范 float类型浮点数共32位，
     * 其中1个符号位，23个有效数字位，8个指数位；
     * 任何数字都将表示成（M 乘 2的N次方）的形式，其中M是含符号的23位二进制数字，N是8位二进制数。
     * 十进制小数中只有类似0.5、0.25、0.125、0.75...这些以5结尾数可以精确的表示，其他的数字只能近似表示。
     * 所以0.9和0.8都是近似数，两个相减近似数为0.1 ，所以结果为false，使用Float类型结果一样
     * @Output false
     */
    @Test
    public void test01() {
        float a = 1.0f - 0.9f;
        float b = 0.9f - 0.8f;
        if (a == b) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    }


    /**
     * @Description 因为float中0.1为近似数，所以赋值给 BigDecimal 也是一个近似数，
     * 所以尽量不要使用float来赋值
     * @Output
     *          0.1000000000000000055511151231257827021181583404541015625
     *          0.1
     */
    @Test
    public  void test02() {
        BigDecimal a = new BigDecimal(0.1);
        System.out.println(a);
        BigDecimal b = new BigDecimal("0.1");
        System.out.println(b);
    }
}
